<?php
/**
 * @desc Redis工具类
 */
namespace Library\Tools;
use Library\ConstKey\SystemKey;
use Phalcon\Mvc\Application;
use Library\ConstKey\RedisKey;

class RedisTools extends Application{

    public $redis;
    public function __construct()
    {
        $this->redis = $this->getDI()->getredis();
    }

    /**
     * @param $key
     * @param $value
     * @param int $timeOut
     * @return bool
     */
    public function set($key, $value, $toJson = true, $timeOut = RedisKey::DEF_TIMEOUT)
    {
        if ($toJson) {
            $value = json_encode($value);
        }
        return $this->redis->set($key, $value, $timeOut);
    }


    /**
     * @param $key
     * @return false|mixed
     */
    public function get($key, $isJson = true)
    {
        //是否走redis缓存
        $isRedis = SystemKey::ISREDIS;
        if($isRedis){
            $data = $this->redis->get($key);
            if ($data) {
                if ($isJson) {
                    return json_decode($data, true);
                }
                return $data;
            }
        }
        return false;
    }


    /**
     * 设置redis锁
     */
    public function setLock($key, $timeOut = RedisKey::REDIS_LOCK,$lock = false)
    {
        $res = $this->redis->setNx($key, $timeOut);
        if($res){
            $this->redis->expire($key, $timeOut);
        }

        if($lock){
            //互斥锁 排队机制
            if($res){
                //微秒（一微秒等于一百万分之一秒）
                usleep(50000);
                $this->setLock($key,$timeOut,$lock);
            }
        }
        return $res;
    }


    /**
     * 删除键
     * @param $key
     */
    public function del($key)
    {
        $this->redis->del($key);
    }

    /**
     * 移除列表的最后一个元素，返回值为移除的元素。
     */
    public function rPop($key)
    {
        return $this->redis->rPop($key);
    }

    /**
     * 将一个或多个值插入到列表头部
     */
    public function lPush($key, array $list)
    {
        array_unshift($list, $key);
        return call_user_func_array([$this->redis, 'lPush'], $list);
    }

    /**
     * 获取列表指定的条数
     */
    public function lrange($key,$limit=2000){
        return $this->redis->lRange($key,0,$limit);
    }

    /**
     * 移除列表元素
     */
    public function lrem($key,$value){
        return $this->redis->lRem($key,$value,0);
    }

    public function lLen($key)
    {
        return $this->redis->lLen($key);
    }
}